﻿/*********************
 * 进出人口处理
 * jiaw 
 * 2011年10月12日
 * ********************/
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using VideoFlowStatistics.EntityClass;
using AForge.Imaging;

namespace VideoFlowStatistics.Class
{
    class InOrOutProcess
    {
        private static int AreaError = 0;//面积误差

        /// <summary>
        /// 获取设置
        /// </summary>
        private static void Init()
        {
            AreaError = Properties.Settings.Default.OneArea;//面积误差
        }

        /// <summary>
        /// 撞线处理
        /// </summary>
        /// <param name="LineAreaFeature">撞线集合</param>
        /// <param name="item">当前帧撞线集合</param>
        /// <param name="StrNowTime">当前撞线时间</param>
        /// <param name="LineNo">撞线编号</param>
        /// <returns></returns>
        public static string IsHavaItemValue(Dictionary<string, CAreaFeature> LineAreaFeature, Blob item, string StrNowTime, int LineNo)
        {
            Init();
            if (LineAreaFeature == null) return "add";
            /*****************************
             * 在误差AreaError范围内，查找区域内所有
             * 面积相似集合，取出相似集合然后升序排列
             * *****************************/

            //判断面积
            var tmpLineAreaFeature = from a in LineAreaFeature
                                     where item.Area - a.Value.areaFeature.Area <= AreaError
                                     select new { a, b = item.Area - a.Value.areaFeature.Area };

            var tmplineAreaFeature = tmpLineAreaFeature.OrderBy(g => g.b).ToList();

            if (tmplineAreaFeature.Count() >= 1)
            {
                var first = tmplineAreaFeature.First();//获取几个第一条数据
                if (first.a.Value.LineOrder != LineNo)//首先判断不是撞的同一条线
                {
                    //人平均5km/h  
                    //double m=(5000*0.4)/(6*3600);//0.4秒移动的长度
                    //if (Math.Abs(item.Rectangle.Y - first.Value.areaFeature.CRectangle.Y) <= m)
                    //{
                    //}
                    /*************************
                     * 判断时间，如果撞的两根线，时间不相同
                     * 返回key，如果时间相同，说明是同时撞线
                     * *************************/
                    //if (first.Value.NowTime != StrNowTime)//
                    //{
                    return first.a.Key;//返回当前集合key用于清除数据
                    //}
                    //else
                    //{
                    //    loop = false;
                    //    return "add";
                    //}
                }
            }
            else//没有直接添加
            {
                return "add";
            }
            return string.Empty;
        }

        public static string IsHavaItemValue(Dictionary<string, CAreaFeature> LineAreaFeature, int center, int LineNo, int Area, string StrNowTime)
        {
            if (LineAreaFeature == null) return "add";
            //中心点误差为5
            //bool loop = true;
            //int k = 1;
            //while (loop)
            //{
            //    var tmplineAreaFeature = LineAreaFeature.Where(m =>
            //                                (center <= m.Value.areaFeature.Center
            //                                && m.Value.areaFeature.Center < center + k)
            //                                && (Area-1 <= m.Value.Area && m.Value.Area < Area + 10));
            //    if (tmplineAreaFeature.Count() == 1)
            //    {
            //        var first = tmplineAreaFeature.First();
            //        if (first.Value.LineOrder != LineNo)//判断是否是上一帧同一撞线区域
            //        {
            //            //当当前时间和链表中时间差小于2s时,确认是同一相视区域
            //            int i = int.Parse(StrNowTime) - int.Parse(first.Value.NowTime);
            //            if (i < 2)//先后同时撞线的两个不同区域
            //            {
            //                if (k > 3)
            //                {
            //                    loop = false;
            //                    return "add";
            //                }
            //                k++;
            //            }
            //            else
            //            {
            //                //返回 人员出去动向
            //                loop = false;
            //                return first.Key;
            //            }
            //        }
            //        loop = false;
            //    }
            //    else
            //    {
            //        if (k > 4)
            //        {
            //            loop = false;
            //            return "add";
            //        }
            //        k++;
            //    }
            //}
            return string.Empty;
        }
    }
}
